package com.qch.handler;

import com.qch.json.RpcRequest;
import com.qch.service.UserService;
import com.qch.service.UserServiceImpl;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.springframework.context.ApplicationContext;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;

/**
 * @Author qch
 * @Date 2021/1/27
 */
public class UserHandler extends ChannelInboundHandlerAdapter {
    //当客户端读取数据时会被调用

    public void channelRead2(ChannelHandlerContext ctx, Object msg) throws Exception {
        //注意：客户端传递一个参数：UserService#sayHello#are you
        //1.判断当前的请求是否符合规则
        if(msg.toString().startsWith("UserService")){
        //2.如果符合调用实现类获得结果
            UserServiceImpl userService = new UserServiceImpl();
            String result = userService.sayHello(msg.toString().substring(msg.toString().lastIndexOf("#")+1));
            //3.把调用实现类方法获得的结果写到客户端
            ctx.writeAndFlush(result);


        }
    }
    /**
     *  序列化协议修改为JSON，使用fastjson作为JSON框架，并根据RpcRequest实体作为通信协议，
     *  服务端需根据客户端传递过来的RpcRequest对象通过反射，动态代理等技术，
     *  最终能够执行目标方法，返回字符串"success"。
     */

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        // 把客户端发送的数据强转成RpcRequest
        RpcRequest rpcRequest = (RpcRequest) msg;
        String result="";
        // 获取接口实现类并执行方法
        ServiceLoader serviceLoader=new ServiceLoader();
        Map<String, UserService> map = serviceLoader.getBeansOfType(UserService.class);
        for(String key:map.keySet()){//keySet获取map集合key的集合  然后在遍历key即可
            int lastDot = rpcRequest.getClassName().lastIndexOf(".");
            String interfaceName = rpcRequest.getClassName().substring(lastDot+1).toLowerCase();
            String keyLower=key.toLowerCase();
            if(keyLower.contains(interfaceName))
            {
                Method method = map.get(key).getClass().getMethod(rpcRequest.getMethodName(),  rpcRequest.getParameterTypes()[0]); // 此时获得了add方法
                result = (String) method.invoke(map.get(key), rpcRequest.getParameters()[0]);
                //map.get(key).sayHello("ss");
            }
        }
        //String result = map.get(rpcRequest.getClassName()).sayHello((String) rpcRequest.getParameters()[0]);
        ctx.writeAndFlush(result);

    }

}
